/**
 * StringUtils.java
 * Product:BaseLayer
 * Version:1.0
 * Copyright 2009 by DNE
 * All Rights Reserved.
 */
package com.site.util;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 常用的字符串处理工具类
 */
public class Utilitys {

	/**
	 * 返回某个对象的字符串形式，主要是为了避免对象为null时，抛空指针异常
	 * 
	 * @param obj
	 * @return
	 */
	public static String toString(Object obj) {
		return obj == null ? "" : obj.toString();
	}

	/**
	 * 判断输入的字符序列是否与正则表达式相匹配，若匹配， 则返回 true,否则返回 false。
	 * 
	 * @param regex
	 *            正则表达式
	 * @param value
	 *            字符序列
	 */
	public static boolean isMatch(String regex, String value) {
		if (StringUtils.isEmpty(value)) {
			return false;
		}
		Pattern p = Pattern.compile(regex);
		Matcher m = p.matcher(value);
		return m.matches();
	}

	/**
	 * 将输入的字符串中包含的特殊字符('&','<', '>', '"')转变为 HTML 代码输出。
	 * 
	 * @param value
	 *            目标字符串
	 * @return
	 */
	public static String escapeHTML(String value) {
		if (StringUtils.isEmpty(value)) {
			return value;
		}
		value = value.replaceAll("&", "&amp;");
		value = value.replaceAll("<", "&lt;");
		value = value.replaceAll(">", "&gt;");
		value = value.replaceAll("\"", "&quot;");
		value = value.replaceAll("\t", "    ");
		value = value.replaceAll(" ", "&nbsp;");
		value = value.replaceAll(" ", "&nbsp;");    //转码后的空格
		return value;
	}
	
	/**
	 * 将输入的字符串中包含的 HTML 代码 转变为 特殊字符('&','<', '>', '"') 输出。
	 * 
	 * @param value 目标字符串
	 * @return
	 */
	public static String unescapeHTML(String value) {
		if (StringUtils.isEmpty(value)) {
			return value;
		}
		value = value.replaceAll("&lt;", "<");
		value = value.replaceAll("&gt;", ">");
		value = value.replaceAll("&quot;", "\"");
		value = value.replaceAll("    ", "\t");
		value = value.replaceAll("&nbsp;", " ");
		value = value.replaceAll("&nbsp;", " ");    //转码后的空格
		value = value.replaceAll("&amp;", "&");
		return value;
	}

	/**
	 * 人民币大小写转换
	 * 
	 * @param money
	 * @return
	 */
	public static String currencyToChinese(double money) {
		if (money == 0) {
			return "零";
		}
		String number[] = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
		String unit[] = { "元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾",
				"佰", "仟", "万" };
		String unit2[] = { "角", "分" };

		// 解释整数部分
		String moneyStr1 = formatNumber("###", money);
		int length = moneyStr1.length();
		StringBuffer sb = new StringBuffer("");
		int lastNumber = -1;
		for (int i = length; i > 0; i--) {
			int bit = Integer.parseInt(moneyStr1.substring(length - i, length
					- i + 1));
			lastNumber = bit;
			if (bit == 0) {
				if (i != 1 && !sb.toString().endsWith(number[0])) {
					sb.append(number[0]);
				}
				if (i == 5 || i == 9) {
					if (sb.toString().endsWith(number[0])) {
						String sbStr = sb.toString();
						sb = new StringBuffer("");
						sbStr = sbStr.substring(0, sbStr.length() - 1);
						sb.append(sbStr + unit[i - 1] + number[0]);
					}
				}

			} else {
				sb.append(number[bit]);
				sb.append(unit[i - 1]);
			}
		}

		if (sb.toString().endsWith(number[0])) {
			String sbStr = sb.toString();
			sb = new StringBuffer("");
			sbStr = sbStr.substring(0, sbStr.length() - 1);
			sb.append(sbStr);
			sb.append("元");
		}

		// 解释小数部分
		String moneyStr2 = formatNumber("###.##", money);
		// 如果没有小数部分
		if (moneyStr2.indexOf(".") == -1) {
			return sb.toString() + "整";
		}

		if (lastNumber == 0) {
			sb.append("零");
		}
		moneyStr2 = moneyStr2.substring(moneyStr2.lastIndexOf(".") + 1,
				moneyStr2.length());
		int length2 = moneyStr2.length();
		for (int i = 0; i < length2; i++) {
			int bit = Integer.parseInt(moneyStr2.substring(i, i + 1));

			if (bit != 0) {
				sb.append(number[bit]);
				sb.append(unit2[i]);
			} else {
				if (lastNumber != 0) {
					sb.append(number[0]);
				}
			}
		}
		return sb.toString();
	}

	/**
	 * 将指点的数字对象按照指点的规则格式化, 例如:###.00,
	 * 
	 * @param regExp
	 * @param obj
	 * @return
	 */
	public static String formatNumber(String regExp, double obj) {
		DecimalFormat format = new DecimalFormat(regExp);
		return format.format(obj);
	}

	/**
	 * 获取指定位数的随机数
	 * 
	 * @param size
	 *            指定的位数
	 * @return
	 */
	public static long getRandom(int size) {
		Double value = (Math.random() * Math.pow(10, size));
		return value.longValue();
	}
	
	/**
	 * 将以逗号分隔开的字符串转换成数组
	 * @param str
	 * @return
	 */
	public static String[] toStringArray(String str){
		if(StringUtils.isEmpty(str)){
			return null;
		}
		return str.split(",");
	}
	
	/**
	 * 四舍五入(保留小数点后2位)
	 * @param price 价格
	 * @return
	 */
	public static Double toRoundingBy2(Double price) {
		return new BigDecimal(price).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();    // 保留2位小数点
	}
	
	/**
	 * 四舍五入(保留小数点后0位)
	 * @param price 价格
	 * @return
	 */
	public static Double toRounding(Double price) {
		return new BigDecimal(price).setScale(0, BigDecimal.ROUND_HALF_UP).doubleValue();    // 保留0位小数点
	}
	/**
	 * 四舍五入
	 * @param price 价格
	 * @param scale 保留几位小数
	 * @return
	 */
	public static Double toRounding(Double price,int scale) {
		return new BigDecimal(price).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
	}
}